//
//  CZHomeViewModel.swift
//  CZVVeiBo
//
//  Created by smile on 2017/8/2.
//  Copyright © 2017年 itcast. All rights reserved.
//

import UIKit

class CZHomeViewModel: NSObject {
    // 模型
    var homeModel: CZHomeModel?{
        didSet{
            // 赋值
            mbrankImage = dealMbrankImage(mbrank: homeModel?.user?.mbrank)
            verifiedImage = dealVerifiedImage(verified: homeModel?.user?.verified ?? -1)
            sinaSource = dealSinaSourceStr(source: homeModel?.source)
            originalAttributedString = dealSinaText(text: homeModel?.text)
            retweetAttributedString = dealSinaText(text: homeModel?.retweeted_status?.text)
        }
    }
    
    /// 会员等级图片
    var mbrankImage: UIImage?
    /// 会员认证图片
    var verifiedImage: UIImage?
    /// 微博来源
    var sinaSource: String?
    /// 微博时间只读属性
    var sinaTimeStr: String?{
        return dealSinaTime(created_at: homeModel?.created_at)
    }
    // 原创微博
    var originalAttributedString: NSAttributedString?
    // 转发微博
    var retweetAttributedString: NSAttributedString?
}

extension CZHomeViewModel{
    
    
    // 处理微博文字图文混排
    // 过节了[允悲][允悲][允悲]
    // 显示: 过节了图图图
    // [哈哈][呵呵]
    // （loc = 0 len = 4）@[呵呵]
    //  (loc = 4 len = 4) @@
    // 倒着遍历
    // [哈哈]@
    // @@
    fileprivate func dealSinaText(text: String?) -> NSAttributedString?{
        // 判断他是否为nil
        guard let t = text else {
            return nil
        }
        
        // 字符串转成富文本
        let allAttr = NSMutableAttributedString(string: t)
        
        //[允悲] [89] [jsjs] [AAA]
        // []代表匹配的是一个字符
        // 结果集合
        let resultMatch = try! NSRegularExpression(pattern: "\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]", options: []).matches(in: t, options: [], range: NSRange(location: 0, length: t.characters.count))
        // 遍历结果集合-> 倒序
        for match in resultMatch.reversed(){
            // 图片描述
            let chs = (t as NSString).substring(with: match.range)
            // 通过图片描述 获取对应的模型
            guard let emoticonModel = CZEmoticonTools.share.getEmoticonModel(chs: chs) else{
                continue
            }
            
            // 获取image
            let png = emoticonModel.allPathPng ?? ""
            let image = UIImage(named: png, in: CZEmoticonTools.share.emoticonBundle, compatibleWith: nil)
            // 计算行高
            let lineHeight = UIFont.systemFont(ofSize: 14).lineHeight
            // 文本附件
            let att = NSTextAttachment()
            att.image = image
            att.bounds = CGRect(x: 0, y: -3, width: lineHeight, height: lineHeight)
            // 不可变的富文本
            let attr = NSAttributedString(attachment: att)
            // 替换指定的图片描述为图片
            allAttr.replaceCharacters(in: match.range, with: attr)
        }
        
        return allAttr
    }
    
    
    // MARK: - 处理微博时间
    /*
     - 微博时间业务逻辑
     - 如果是今年
     - 如果是今天
     - 如果小于60
     - 显示 刚刚
     - 如果大于等于60 && 小于3600
     - 显示 XX分钟前
     - 如果大于等于3600
     - 显示 XX小时前
     - 如果是昨天
     - 20170803 02:02:02 格式 昨天 02:02
     - 其他
     - 20170707 07:07:07 格式: 07月07日 07:07
     - 如果不是今年
     - 20151212 12:12:12 显示格式: 2015年12月12日 12:12
     */
    
    func dealSinaTime(created_at: Date?) -> String?{
        // 判断created_at是否为nil
        guard let createAt = created_at else {
            return nil
        }
        
        // 测试数据
//        let createAt = createAt1.addingTimeInterval(-6000*2*10*10)
        
        // 时间格式化
        let df = DateFormatter()
        // 判断是否是今年
        // 今年
        if isThisYear(createAt: createAt) {
            
            // 日历类
            let calendar = Calendar.current
            // 判断今天
            if calendar.isDateInToday(createAt) {
                // 计算秒数 微博日期-当前的日期
                let s = -createAt.timeIntervalSinceNow
                // 如果s<60
                if s < 60 {
                    return "刚刚"
                }else if s >= 60 && s < 3600{
                    // 如果s >= 60 && s < 3600
                    return "\(Int(s/60))分钟前"
                }else{
                    // s >= 3600
                    return "\(Int(s/3600))小时前"
                }
                
            }else if calendar.isDateInYesterday(createAt){
                // 昨天
                // 格式 昨天 02:02
                df.dateFormat = "昨天 HH:mm"
            }else{
                // 其他
                // 格式: 07月07日 07:07
                df.dateFormat = "MM月dd日 HH:mm"
            }
        }else{
            // 不是今年
            // 显示格式: 2015年12月12日 12:12
            // 指定日期格式
            df.dateFormat = "yyyy年MM月dd日 HH:mm"
        }
        return df.string(from: createAt)
    }
    
    // 判断是否是今年
    func isThisYear(createAt: Date) -> Bool{
        // 时间格式化
        let df = DateFormatter()
        // 指定格式
        df.dateFormat = "yyyy"
        // 获取当前的日期
        let date = Date()
        // 获取字符串
        let sinaTimeStr = df.string(from: createAt)
        let currentTimeStr = df.string(from: date)
        return sinaTimeStr == currentTimeStr
    }
    
    
    // MARK: - 处理微博来源字符串
    /*
     Optional("<a href=\"http://app.weibo.com/t/feed/6vtZb0\" rel=\"nofollow\">微博 weibo.com</a>")
     Optional("<a href=\"http://app.weibo.com/t/feed/4fuyNj\" rel=\"nofollow\">即刻笔记</a>")
     Optional("<a href=\"http://app.weibo.com/t/feed/6vtZb0\" rel=\"nofollow\">微博 weibo.com</a>")
     */
    fileprivate func dealSinaSourceStr(source: String?) -> String{
        // 判断是否为nil 且是否包含">
        guard let s = source, s.contains("\">")  else {
            return "来自 + ~~~~~"
        }
        // 获取光标微博
        let startIndex = s.range(of: "\">")!
        let endIndex = s.range(of: "</")!
        
        // 截取字符串
        let result = s.substring(with: startIndex.upperBound..<endIndex.lowerBound)
        return "来自 + \(result)"
    }
    
    // 认证类型 -1：没有认证，1，认证用户，2,3,5: 企业认证，220: 达人
    //    var verified: Int = -1
    fileprivate func dealVerifiedImage(verified: Int) -> UIImage?{
        //        // 判断verified是否为nil
        //        guard let v = verified else {
        //            return UIImage(named: "avatar_vgirl")
        //        }
        // 定义一个字符串记录图片
        let imgName: String
        
        switch verified {
        case 1:
            imgName = "avatar_vip"
        case 2,3,5:
            imgName = "avatar_enterprise_vip"
        case 220:
            imgName = "avatar_grassroot"
        default:
            imgName = "avatar_vgirl"
        }
        return UIImage(named: imgName)
    }
    
    
    // MARK: - 处理会员等级业务逻辑
    // /// 会员等级 1-6
    fileprivate func dealMbrankImage(mbrank: Int?) -> UIImage?{
        // 判断mbrank是否为nil
        guard let m = mbrank else {
            return UIImage(named: "common_icon_membership")
        }
        //会员等级 10-16
        if m >= 1 && m <= 6 {
            return UIImage(named: "common_icon_membership_level\(m)")
        }
        
        return UIImage(named: "common_icon_membership")
    }
}
